package cn.song.logread.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

/**
 * 文件控制器
 *
 * @deprecated 暂不开放，后期需做安全措施
 * @author SongRenShuo
 * @date 2025/03/16
 */
@Slf4j
// @RestController
@RequestMapping("/api/files")
public class FileController {

    /**
     * 文件下载接口
     * 根据传入的文件路径，下载指定文件
     *
     * @param filePath 文件路径
     * @return ResponseEntity 包含文件资源的响应实体
     * @throws IOException 如果文件读取过程中发生IO异常
     */
    @GetMapping("/download/{filePath:.+}")
    public ResponseEntity<Resource> downloadFile(@PathVariable String filePath) throws IOException {
        // 构建文件路径
        File file = new File(filePath);

        // 记录日志，输出尝试下载的文件路径
        log.info("尝试下载文件: {}", filePath);
        // 记录日志，输出文件是否存在
        log.info("文件是否存在: {}", file.exists());

        // 如果文件不存在，返回404 Not Found响应
        if (!file.exists()) {
            return ResponseEntity.notFound().build();
        }

        // 创建文件资源
        Resource resource = new FileSystemResource(file);

        // 设置响应头，包括Content-Disposition和Content-Type
        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION,
                   "attachment; filename*=UTF-8''" + URLEncoder.encode(file.getName(), StandardCharsets.UTF_8.toString()));
        headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);

        // 返回包含文件资源的响应实体
        return ResponseEntity.ok()
                .headers(headers)
                .contentLength(file.length())
                .contentType(MediaType.APPLICATION_OCTET_STREAM)
                .body(resource);
    }
}
